import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 *
 * @Package:
 * @ClassName: WordCount
 * @Author: 王坚伟
 * @CreateTime: 2021/9/27 16:03
 * @Description:
 */
object WordCount {
  def main(args: Array[String]): Unit = {
    //创建Spark运行配置对象
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")

    //创建Spark上下文环境对象（连接对象）
    val sc : SparkContext = new SparkContext(sparkConf)

    //读取文件数据，读取一行一行的数据
    val fileRDD: RDD[String] = sc.textFile("input/word.txt")

    //将文件中的一行行数据进行分词
    //扁平化：将整体拆分成个体的操作
    val wordRDD: RDD[String] = fileRDD.flatMap( _.split(" "))

    //转换数据结构word => (word, 1)
    // map表示操作每个个体
    val word2OneRDD: RDD[(String, Int)] = wordRDD.map((_,1))

    //将转换结构后的数据按照相同的key进行分组聚合
    //reduceByKey是spark特有的方法
    val word2CountRDD: RDD[(String,Int)] = word2OneRDD.reduceByKey(_+_)

    //将数据聚合结果采集到内存中
    val word2Count: Array[(String, Int)] = word2CountRDD.collect()

    //打印结果
    word2Count.foreach(println)

    //关闭Spark连接
    sc.stop()
  }

}
